// stores/option.js选项式创建Store实例
import {defineStore} from 'pinia';
import {useSetupStore} from '@/stores/setup.js';

/**
 * defineStore的用法说明
 *  - defineStore所创建的实例一般以useXxxStore命名
 *  - 第一个参数为必传的独一无二的名称，用于连接Store和Devtools
 *  - 第二个参数为带有state、getters和actions属性的Option对象，三者类似于Vue组件中的data、computed和methods
 */
export const useOptionStore = defineStore('option', {
  state: () => ({
    string: 'SYX',
    number: 10,
    boolean: true,
    array: ['A', 'B', 'C'],
    object: {name: 'SYX', age: 19},
  }),
  getters: {
    encrypt: (state) => '加密**' + state.string + '**加密',
    useOther(state) {
      // 调用其他Store
      const setupStore = useSetupStore();
      console.log(setupStore); // Proxy(Object) {$id: 'setup', $onAction: ƒ, $patch: ƒ, $reset: ƒ, $subscribe: ƒ, …}
      
      // 调用其他Getter，this指向Store实例
      console.log(this.encrypt); // 加密**SYX**加密
      
      return '再次加密--' + this.encrypt + '--再次加密';
    },
    passParams: (state) => {
      // 不能向计算属性传递任何参数，可通过返回函数的方式实现传参
      return (params) => {
        console.log('传参成功', params);
      };
    },
  },
  actions: {
    increment() {
      // this指向Store实例
      this.number++;
    },
    async asynchronous() {
      // async-await异步函数
      await new Promise(resolve => {
        console.log('异步Promise');
        resolve();
      });
    },
    useOthers() {
      // 调用其他Store
      const setupStore = useSetupStore();
      console.log(setupStore); // Proxy(Object) {$id: 'setup', $onAction: ƒ, $patch: ƒ, $reset: ƒ, $subscribe: ƒ, …}
      
      console.log('调用其他Store');
    }
  }
});